/*
银行取款系统
在这个例子中，多个客户线程尝试从同一个银行账户中取款。
银行账户的余额是一个共享资源，因此需要用互斥锁来保护，以防止多个线程同时访问导致的数据竞争。
同时，我们使用一个无名信号量来模拟银行柜员的数量限制，即同一时间最多只能有几个客户同时进行取款操作。*/

#include <head.h>

pthread_t Tid[10];
pthread_mutex_t mutex;
sem_t sem;
int money = 1000;
// int num = 0;
int arr[10];
void *func(void *val);
int main(int argc, char const *argv[])
{
    // 初始化互斥锁
    pthread_mutex_init(&mutex, NULL);
    // 初始化无名信号量
    sem_init(&sem, 0, 3);
    // 创建线程
    for (int i = 0; i < 10; i++)
    { // printf("%d",arr[i]);
        arr[i] = i + 1;
        pthread_create(&Tid[i], NULL, func, (void *)&arr[i]);
    }

    // 回收线程
    for (int i = 0; i < 10; i++)
    {
        pthread_join(Tid[i], NULL);
    }
    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);
    // 销毁无名信号量
    sem_destroy(&sem);
    return 0;
}

void *func(void *val)
{
    sem_wait(&sem);
    pthread_mutex_lock(&mutex);
    // printf("%p\n", ((int *)val));
    if (money > 50)
    {   printf("=======================\n");
        printf("正在进行取钱操作中.....\n");
        sleep(2);
        money -= 50;
        printf("客户 %d 取钱五十元 剩余 %d 元 \n", *((int *)val), money);
        sleep(2);
        printf("=======================\n");
    }
    else
    {
        printf("余额不足不能取钱！\n");
    }

    pthread_mutex_unlock(&mutex);
    sem_post(&sem);
}